package com.zc.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	private static SessionFactory sessionFactory = null;// SessionFactory对象

	static {
		try {
			Configuration cfg = new Configuration().configure();// 默认加载classpath根目录下的hibernate.cfg.xml
			sessionFactory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
			System.err.println("创建会话工厂失败");
			e.printStackTrace();
		}

	}

	/**
	 * 获取Session对象
	 * 
	 * @return
	 */
	public static Session getSession() {
		Session session = threadLocal.get();
		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null)?sessionFactory.openSession():null;
			threadLocal.set(session);
		}
		
		return session;
	}

	/**
	 * 重建会话工厂
	 */
	public static void rebuildSessionFactory() {
		try {
			Configuration cfg = new Configuration().configure();// 默认加载classpath根目录下的hibernate.cfg.xml
			System.out.println("-------------------------");
			System.out.println(cfg);
			System.out.println("-------------------------");
			sessionFactory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
			System.err.println("创建会话工厂失败");
			e.printStackTrace();
		}
	}

	/**
	 * 获取SessionFactory对象
	 * 
	 * @return
	 */
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	/**
	 * 关闭Session
	 * 
	 * @throws HibernateException
	 */
	public static void closeSession() throws HibernateException {
		Session session = threadLocal.get();
		threadLocal.set(null);
		if (session != null) {
			session.close();// 关闭Session
		}
	}
}
